package cn.itcast.nems.studentrecord.service.studentrecord;

import cn.itcast.nems.studentrecord.api.StudentRecordPaymentApi;
import cn.itcast.nems.studentrecord.dao.entity.StudentRecordPayment;
import cn.itcast.nems.studentrecord.dto.studentrecord.StudentRecordCurrentPaymentDTO;
import cn.itcast.nems.studentrecord.dto.studentrecord.StudentRecordPaymentDTO;
import cn.itcast.nems.studentrecord.enumeration.StudentRecordPaymentStateEnum;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jetbrains.annotations.NotNull;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;

import java.math.BigDecimal;
import java.util.List;

public interface StudentRecordPaymentService extends IService<StudentRecordPayment>, StudentRecordPaymentApi {

    /**
     * 根据学籍ID获取当前分次支付信息
     *
     * @param studentRecordId 学籍ID
     * @return 分次支付信息
     */
    StudentRecordCurrentPaymentDTO queryPartialPaymentByStudentRecordId(@NonNull String studentRecordId);

    /**
     * 修改本次支付金额
     *
     * @param studentRecordId 学籍ID
     * @param amount          支付金额
     */
    StudentRecordCurrentPaymentDTO modifyPartialPaymentAmount(@NonNull String studentRecordId, @NonNull BigDecimal amount);

    /**
     * 创建一个新的待支付记录,
     * 同时会取消其他待支付的记录
     *
     * @param studentRecordId 学员学籍ID
     * @param amount          支付金额
     * @return 新的待支付记录
     */
    StudentRecordPaymentDTO createNewPendingRecord(@NotNull String studentRecordId, @NotNull BigDecimal amount);

    /**
     * 根据学籍ID及状态获取学籍付款信息
     *
     * @param studentRecordId 学籍ID
     * @param state           状态
     * @return 学籍付款信息
     */
    List<StudentRecordPaymentDTO> queryByStudentRecordIdAndStatus(@NonNull String studentRecordId, @Nullable StudentRecordPaymentStateEnum state);

    /**
     * 根据商户订单号获取学籍支付记录
     *
     * @param merchantOrderNo 商户订单号
     * @return 学籍支付记录
     */
    StudentRecordPaymentDTO queryByMerchantOrderNo(@NonNull String merchantOrderNo);

    /**
     * 根据学籍ID取消PENDING状态的支付记录
     *
     * @param studentRecordId 学籍ID
     */
    void cancelOtherPendingRecordByStudentRecordId(@NonNull String studentRecordId);
}
